/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Progra1;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

/**
 *
 * @author manuel
 */
public class Caso8BD {

    private Connection conexion;

    public Caso8BD() {
        conexion = null;

    }

    /*
     * Metodo encargado de establecer la conexion por medio de la clase ConexionBD
     */
    public void conectarBD() {
        conexion = ConexionBD.getConnection();
    }

    /*
     * Metodo encargado de obtener el id en el caso 2
     */
    public long caso8TransApp(String fecha, int monto, String moneda, String NoCuentaOrigen, String NoCuentaDestino) throws SQLException {
        PreparedStatement instruccionupdate1 = null;
        PreparedStatement instruccionupdate2 = null;
        PreparedStatement instruccionInsert = null;
        long duracion = 0;
        Date tiempoInicio = new Date();
        try {
            conexion.setAutoCommit(false);

            instruccionupdate1 = conexion.prepareStatement("update  Cuentas set Saldo = Saldo - ? where NoCuenta= ?;");

            instruccionupdate1.setInt(1, monto);
            instruccionupdate1.setString(2, NoCuentaOrigen);
            instruccionupdate1.executeUpdate();


            instruccionupdate2 = conexion.prepareStatement("update  Cuentas set Saldo = Saldo + ? where NoCuenta= ?;");
            instruccionupdate2.setInt(1, monto);
            instruccionupdate2.setString(2, NoCuentaDestino);
            instruccionupdate2.executeUpdate();

            instruccionInsert = conexion.prepareStatement("insert into Transferencias values (?,?,?,?,?);");
            instruccionInsert.setString(1, fecha);
            instruccionInsert.setInt(2, monto);
            instruccionInsert.setString(3, moneda);
            instruccionInsert.setString(4, NoCuentaOrigen);
            instruccionInsert.setString(5, NoCuentaDestino);
            instruccionInsert.executeUpdate();

            conexion.commit();


        } catch (SQLException e) {
            conexion.rollback();
        } finally {
            Date tiempoFinal = new Date();
            duracion = tiempoFinal.getTime() - tiempoInicio.getTime();

            if (instruccionupdate1 != null) {
                try {
                    instruccionupdate1.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccionupdate1 = null;
            }
            if (instruccionupdate2 != null) {
                try {
                    instruccionupdate2.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccionupdate2 = null;
            }
            if (instruccionInsert != null) {
                try {
                    instruccionInsert.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccionInsert = null;
            }
        }
        return duracion;
    }

    public long caso8TransBD(String fecha, int monto, String moneda, String NoCuentaOrigen, String NoCuentaDestino) {
        CallableStatement instruccion = null;
        long duracion = 0;
        Date tiempoInicio = new Date();
        try {
            instruccion = conexion.prepareCall("{call Transaccion(?,?,?,?,?)}");

            instruccion.setString(1, fecha);
            instruccion.setInt(2, monto);
            instruccion.setString(3, moneda);
            instruccion.setString(4, NoCuentaOrigen);
            instruccion.setString(5, NoCuentaDestino);
            instruccion.execute();
        } catch (Exception ex) {
            System.out.println(ex);
            return 0;
        } finally {

            Date tiempoFinal = new Date();
            duracion = tiempoFinal.getTime() - tiempoInicio.getTime();
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }

        }
        return duracion;
    }
}
